/**
 * @User: vitobo
 * @Date: 2024-05-24
 * @Description:  抽象类和接口
 *
 *  抽象类: 一个类中没有足够包含的信息来描绘一个具体的对象
 *
 *  接口: 就是公共的行为规范标准; 多个类的公共规范,是一种引用数据类型
 *  1. 使用interface来修饰接口
 *  2. 接口当中的成员方法, 不能有具体的实现
 *      1.抽象方法: 默认是public abstract的方法
 *      2.JDK1.8开始 允许有可以实现的方法, 但是这个方法只能是由default修饰的
 *      3.可以实现一个静态方法
 *   3. 所有的方法都是public的
 *   4. 成员变量默认是public static final修饰的
 *   5. 接口不能被实例化
 *   6. 类和接口之间采用implements, 来实现多个接口
 *   7. 子类重写抽象方法, 必须加上public
 *   8. 接口当中不能有静态代码块和构造方法
 *   9. 如果你不想实现接口的方法, 那么就把这类定义为抽象类.    如果这个类 被其它类继承, 那么就必须重写
 *
 *
 */
// 抽象类: 被abstract修饰的类
abstract class Shape{
    // 抽象方法: 被abstract修饰的方法, 没有方法体
    abstract public void draw();

    // 抽象方法不能是私有的
    // abstract private void size();

    // 抽象方法不能被final和static修饰, 因为抽象方法要被子类重写
    // abstract final static void num();

    // 抽象类也是类, 可以增加普通方法和属性
    public Double getArea(){
        return area;
    }

    protected double area;
}

class Rect111 extends Shape{
    private double length;
    private double width;

    Rect111(double length, double width){
        this.length = length;
        this.width = width;
    }

    @Override
    public void draw(){
        System.out.println("矩形: length=" + length + " width=" + width);
    }

    public void calcaREA(){
        area = length * width;
    }
}

class Circle extends Shape{
    private double r;
    final private static double PI = 3.14;
    public Circle(double r){
        this.r = r;
    }

    @Override
    public void draw(){
        System.out.println("圆：r = "+r);
    }
    public void calcArea(){
        area = PI * r * r;
    }
}

abstract class Triangle extends Shape {
    private double a;
    private double b;
    private double c;
    @Override
    public void draw() {
        System.out.println("三角形：a = "+a + " b = "+b+" c = "+c);
    }
}


public class Test {

    public static void main(String[] args) {
        // 抽象类不能直接实例化对象
        // Shape shape = new Shape();

    }
}
